package com.fates.common.codec;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.commons.lang3.StringUtils;

/**
 * SHA-1不可逆加密工具类
 * @author fxh
 */
public class Sha1Utils {

	private static final String SHA1 = "SHA-1";
	private static final String DEFAULT_ENCODING = "UTF-8";
	
	/**
	 * 生成随机的Byte[]作为salt密钥.
	 * @param numBytes byte数组的大小
	 */
	public static byte[] genSalt(int numBytes) {
		return DigestUtils.genSalt(numBytes);
	}

	/**
	 * 对输入字符串进行sha1散列.
	 */
	public static byte[] sha1(byte[] input) {
		return DigestUtils.digest(input, SHA1, null, 1);
	}

	/**
	 * 对输入字符串进行sha1散列.
	 */
	public static byte[] sha1(byte[] input, byte[] salt) {
		return DigestUtils.digest(input, SHA1, salt, 1);
	}

	/**
	 * 对输入字符串进行sha1散列.
	 */
	public static byte[] sha1(byte[] input, byte[] salt, int iterations) {
		return DigestUtils.digest(input, SHA1, salt, iterations);
	}

	/**
	 * 对文件进行sha1散列.
	 */
	public static byte[] sha1(InputStream input) throws IOException {
		return DigestUtils.digest(input, SHA1);
	}

	
	
	/**
	 * 对输入字符串进行sha1散列.
	 * @param input 加密字符串
	 * @param iterations 迭代次数
	 */
	public static String sha1(String input) {
		try {
			return EncodeUtils.encodeHex(sha1(input.getBytes(DEFAULT_ENCODING)));
		} catch (UnsupportedEncodingException e) {
			return StringUtils.EMPTY;
		}
	}
	
	/**
	 * 对输入字符串进行md5散列.
	 * @param input 加密字符串
	 * @param numBytes salt byte数组的大小
	 * @param iterations 迭代次数
	 */
	public static String sha1(String input, int numBytes) {
		try {
			return sha1(input,numBytes,1);
		} catch (Exception e) {
			return StringUtils.EMPTY;
		}
	}
	
	/**
	 * 对输入字符串进行md5散列.
	 * @param input 加密字符串
	 * @param numBytes salt byte数组的大小
	 * @param iterations 迭代次数
	 */
	public static String sha1(String input, int numBytes, int iterations) {
		try {
			byte[] salt= DigestUtils.genSalt(numBytes);
			return EncodeUtils.encodeHex(sha1(input.getBytes(DEFAULT_ENCODING),salt,iterations));
		} catch (UnsupportedEncodingException e) {
			return StringUtils.EMPTY;
		}
	}
	
	public static void main(String[] args) {

		String s = "hello word!";
		System.out.println("被加密字符串："+s);

		String ss = sha1(s,8);
		System.out.println("第一次SHA-1加密,迭代1次后加密后字符串："+ss+",salt数组长度 8");
		System.out.println("第一次加密后字符串长度："+ss.length());	
		
		String ss1 = sha1(s,6);
		System.out.println("第二次SHA-1加密,迭代1次后加密后字符串："+ss1+",salt数组长度 6");
		System.out.println("第二次加密后字符串长度："+ss1.length());	
		String ss2 = sha1(s,6,2);
		System.out.println("SHA-1加密,迭代2次后加密后字符串："+ss2+",salt数组长度 6");
		System.out.println("加密后字符串长度："+ss2.length());	
		String ss3 = sha1(s,6,3);
		System.out.println("第一次SHA-1加密,迭代3次后加密后字符串："+ss3+",salt数组长度 6");
		System.out.println("第一次加密后字符串长度："+ss3.length());	
		String ss31 = sha1(s,6,3);
		System.out.println("第二次SHA-1加密,迭代3次后加密后字符串："+ss31+",salt数组长度 6");
		System.out.println("第二次加密后字符串长度："+ss31.length());	
		
	}
}
